﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="IRepositoryBase.cs" company="BS - Desenvolvemento">
//   Desenvolvimento de solucoes tecnologicas para automacao em geral
// </copyright>
// <summary>
//   A interface de repositorio base.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

namespace ProjetoModeloDDD.Domain.Interfaces.Repositories
{
    using System.Collections.Generic;

    /// <summary>
    /// A interface de repositorio base.
    /// </summary>
    /// <typeparam name="TEntity">
    /// Implementa uma entidade generica do tipo class
    /// </typeparam>
    public interface IRepositoryBase<TEntity> where TEntity : class
    {
        /// <summary>
        /// O metodo add.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser adicionado.
        /// </param>
        void Add(TEntity obj);

        /// <summary>
        /// O metodo dispose.
        /// </summary>
        void Dispose();

        /// <summary>
        /// O metodo que retorna uma lista de objetos.
        /// </summary>
        /// <returns>
        /// Retorna uma lista de objetos.
        /// </returns>
        IEnumerable<TEntity> GetAll();

        /// <summary>
        /// Metodo que retorna um objeto atraves da consulta por id.
        /// </summary>
        /// <param name="id">
        /// O id a ser consultado.
        /// </param>
        /// <returns>
        /// Retorna o objeto consultado.
        /// </returns>
        TEntity GetbyId(int id);

        /// <summary>
        /// Metodo que remove o objeto do repositorio.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser removido.
        /// </param>
        void Remove(TEntity obj);

        /// <summary>
        /// Metodo para atualizar um objeto.
        /// </summary>
        /// <param name="obj">
        /// O objeto a ser atualizado.
        /// </param>
        void Update(TEntity obj);
    }
}